<?php
// 定义类文件位置
class UserLevel
{
    /**
     * 更改用户的等级
     *
     * @param int $userid 用户ID
     * @param int $level 新的等级
     * @param bool $auto 是否自动调整（默认false）
     * @param int $lock 是否锁定等级（0或1，默认0）
     * @return bool 操作是否成功
     */
    public static function change($userid, $level, $auto = false, $lock = 0)
    {
        // 参数验证
        if (!is_int($userid) || !is_int($level) || ($auto && !is_bool($auto)) || !in_array($lock, [0, 1])) {
            return false;
        }

        // 开始事务
        M('user')->startTrans();
        try {
            $user = M('user')->where(array('id' => $userid))->find();
            if (empty($user) || $level == $user['level'] || ($auto && $user['level_lock'])) {
                return false;
            }

            $update = array('level' => $level);
            if (!$auto) {
                $update['level_lock'] = $lock;
            }

            if ($level < $user['level']) {
                // 处理降级逻辑：批量更新子用户的 team_out 状态
                self::handleDemotion($user, $level);
            } elseif ($user['yqr']) {
                // 处理升级逻辑
                $parent = M('user')->where(array('yqm' => $user['yqr']))->find();
                if (!$user['team_out'] && $parent && $parent['level'] != 3 && $parent['level'] <= $level) {
                    $update['team_out'] = 1;
                }
            }

            // 更新用户等级信息
            M('user')->where(array('id' => $userid))->save($update);

            // 提交事务
            M('user')->commit();

            // 检查并调整父级用户的等级
            if ($level == 2 && $parent && $parent['level'] == 2) {
                self::checkUserLevel($parent['id']);
            }

            return true;
        } catch (\Exception $e) {
            // 回滚事务
            M('user')->rollback();
            // 记录日志或处理异常
            Log::write($e->getMessage());
            return false;
        }
    }

    /**
     * 处理降级逻辑
     *
     * @param array $user 用户信息
     * @param int $level 新的等级
     */
    private static function handleDemotion($user, $level)
    {
        // 获取所有符合条件的子用户ID
        $childIds = M('user')
            ->field('id')
            ->where(array('yqr' => $user['yqm'], 'team_out' => 0, 'level' => array('EGT', $level)))
            ->getField('id', true);

        if (!empty($childIds)) {
            // 批量更新这些子用户的 team_out 状态
            M('user')->where(array('id' => array('IN', $childIds)))->save(array('team_out' => 1));
        }
    }

    /**
     * 检查并调整用户的等级
     *
     * @param int $userid 用户ID
     * @return bool 操作是否成功
     */
    public static function checkUserLevel($userid)
    {
        $user = M('user')->where(array('id' => $userid))->find();
        if (empty($user) || $user['level'] == 3 || $user['level_lock']) {
            return false;
        }

        // 获取子用户信息及统计信息
        $childs = M('user')
            ->field('id, level, shouyi, team_out')
            ->where(array('yqr' => $user['yqm'], 'reg'=>1))
            ->select();

        $yunying_count = count(array_filter($childs, function($child) {
            return $child['level'] == 2;
        }));
        $child_shouyi = array_sum(array_map(function($child) {
            return !$child['team_out'] ? $child['shouyi'] : 0;
        }, $childs));

        // 确定新的等级
        $new_level = 0;
        if ($user['level'] == 2 && $yunying_count >= 5) {
            $new_level = 3;
        } elseif ($child_shouyi + $user['shouyi'] >= 100000) {//10万积分 1万元
            $new_level = 2;
        } elseif (count($childs) >= 5) {
            $new_level = 1;
        }

        // 如果新等级不低于当前等级，则不进行调整
        if ($new_level <= $user['level']) {
            return false;
        }

        // 自动调整用户等级
        return self::change($userid, $new_level, true);
    }
}